//package com.datastructure;
//
//
//
//import java.io.*;
//import java.util.*;
//import java.util.concurrent.*;
//
//
///**
// * @author: 临晖
// * @date: 2023/10/26
// * @description:
// */
//public class WordCount {
//
//    /**
//     * 1.读取一个包含文本的文件，文件名为 input.txt ，并将其中的每行文本都存储到一个 List<string>中。
//     * 2.对上述 List<string>中的每行文本进行处理，并记录其中所有单词出现的次数，存储到一个 Map<string，Integer>中。为了简化程序，这里我们假设一个单词只包含英文字母，并且不区分大小写，即在统计单词出现次数时，应该将相同单词的大小写视为相同单词。
//     * 3.将上述 Map<string，Integer>中的所有单词按照出现次数从高到低排序，并输出到文件 output.txt 中。
//     * 4.创建一个线程池，用于并发计算上述文本中所有单词出现的次数。具体地，将上述每行文本的处理过程分配到不同的子线程中并
//     *
//     * @param args
//     */
//    public static void main(String[] args) throws Exception {
//        WordCount wordCount = new WordCount();
//        //单词文件所在位置
//        String readerPath = "F:/word.txt";
//        //单词写出文件位置
//        String writerPath = "F:/word_count.txt";
//        //1.读取文件
//        List<String> lines = wordCount.readFile(readerPath);
//        //2.处理list，采用线程池
//        Map<String, Integer> wordNum = wordCount.count(lines);
//        //3.处理map，以单词出现的次数排序，从大到小
//        List<Map.Entry<String, Integer>> numSort = wordCount.mapSort(wordNum);
//        //4.输出文件
//        wordCount.wirterFile(numSort, writerPath);
//    }
//
//
//    /**
//     * 传入文件路径，读取文件
//     *
//     * @param path
//     * @return
//     * @throws Exception
//     */
//    public List<String> readFile(String path) throws Exception {
//
//        //存放每行单词
//        ArrayList<String> list = new ArrayList<>();
//        File file = new File(path);
//        if (!file.exists()) {
//            //文件不存在，创建一个文件
//            try {
//                file.createNewFile();
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//            return list;
//        }
//
//        //文件存在
//        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
//        String line = "";
//        while ((line = bufferedReader.readLine()) != null) {
//            //防止有多个空行
//            if (!"".equals(line)) {
//                list.add(line);
//            }
//
//        }
//
//        //关闭流
//        bufferedReader.close();
//        System.out.println("文件[" + path + "]读取完成");
//        //返回结果
//        return list;
//    }
//
//
//    /**
//     * 将文本中的单词个数统计出来，然后返回对应的单词及其出现个数
//     *
//     * @param list
//     * @return
//     * @throws Exception
//     */
//    public Map<String, Integer> count(List<String> list) throws Exception {
//        System.out.println("--------------\n开始单词统计");
//        // 返回参数，用于存储单词及其对应出现个数
//        Map<String, Integer> map = Collections.synchronizedMap(new HashMap<>());
//        // 创建线程池
//        //corePoolSize -->最佳运行线程
//        //maximumPoolSize–>最大运行线程
//        //keepAliveTime–>等待时间
//        //unit，–>等待时间单位
//        //workQueue–>等待队列
//        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
//        // 执行任务
//        for (int i = 0; i < list.size(); i++) {
//            final String line = list.get(i);
//            threadPool.submit(() -> {
//                // 正则匹配，防止中间有多个空格
//                String[] words = line.split("\\s+");
//
//                for (String word : words) {
//                    // 忽略大小写
//                    map.compute(word.toLowerCase(), (key, count) -> count == null ? 1 : count + 1);
//                }
//            });
//
//            System.out.println("文本单词处理进度：" + (i + 1) * (100.0 / list.size()) + "%");
//        }
//        threadPool.shutdown();
//        threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
//        System.out.println("单词统计完成");
//        return map;
//    }
//
//
//    /**
//     * 将map中的内容写入文件
//     *
//     * @param list
//     * @param path 输出文件所在位置
//     * @throws Exception
//     */
//    public void wirterFile(List<Map.Entry<String, Integer>> list, String path) throws Exception {
//        //创建输出流
//        BufferedWriter writer = new BufferedWriter(new FileWriter(new File(path)));
//        //循环写入
//        for (Map.Entry<String, Integer> entry : list) {
//            writer.write(entry.getKey() + " : " + entry.getValue());
//            writer.newLine();
//        }
//        System.out.println("--------------\n单词统计成功，于[" + path + "]中查看");
//        //关闭流
//        writer.close();
//    }
//
//
//
//}
